home *** CD-ROM | disk | FTP | other *** search
- /*
- * TOUCH.C - Change the last modification date and time of a file.
- *
- * PROGRAMMER: Martti Ylikoski
- * CREATED: 8.12.1990
- */
- static char* VERSION="Version 1.1. Copyright (c) Martti Ylikoski. 1990, 1991." ;
- /*
- */
-
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #include <string.h>
- #include <param.h>
- #include <paramstd.h>
- #define INCL_DOS
- #include <os2.h>
-
- static char *progname, *fname ;
-
- extern unsigned long pflags ;
-
- ParamEntry pentry[12] = {
- "P", &ParamSetPause, 0,
- "F", &ParamSetFold, 0,
- "V", &ParamSetVerbose, 0,
- "R", &ParamSetReport, 0,
- "S", &ParamSetSubDirs, 0,
- "?", &ParamSetHelp, 1,
- "H", &ParamSetHelp, 1,
- "NOD", &ParamSetNoDefault, 0,
- "TEST", &ParamSetTest, 0,
- "Y", &ParamSetYes, 0,
- "N", &ParamSetTest, 0,
- "\0", NULL, 0
- } ;
-
- ParamBlock params = {
- "/-", IGNORECASE | NOPRIORITY | NOTRIGGERSALLOWED ,
- pentry
- } ;
-
- /* local prototypes */
- static int touch(char *fname) ;
-
- int main(int argc, char *argv[])
- {
- int i ;
-
- progname = argv[0] ;
-
- ParamHandle(¶ms, &argc, argv) ;
-
- if (pflags & PA_HELP || argc == 1)
- {
- printf("%s - change the last modification time and date of a file.\n", progname) ;
- puts(VERSION) ;
- puts("Usage: touch file(s) [/H | /?]") ;
- puts("Where,") ;
- puts(" /H,/? = Help") ;
- return( 0 ) ;
- }
-
- fname = argv[1] ;
-
- for (i = 1; i <argc; i++)
- touch(argv[i]) ;
- return( 0 ) ;
- }
-
- static int touch(char *fname)
- {
- HFILE hf ;
- int c ;
- USHORT action, ret ;
- FILESTATUS fstat ;
- DATETIME dtim ;
-
- /* open file */
-
- if ((ret = DosOpen(fname, &hf, &action, 0L, FILE_NORMAL,
- FILE_OPEN|FILE_CREATE,OPEN_ACCESS_READWRITE|OPEN_SHARE_DENYREADWRITE, 0L)) != 0)
- {
- printf("%s error %d opening file %s\n", progname, ret, fname) ;
- DosClose(hf) ;
- return( (int) ret ) ;
- }
-
- if (( ret = DosQFileInfo(hf, 1, (PVOID) &fstat, sizeof(fstat))) != 0)
- {
- printf("%s error in DosSetFileInfo\n", progname) ;
- DosClose(hf) ;
- return( (int) ret ) ;
- }
-
- if (( ret = DosGetDateTime(&dtim)) != 0)
- {
- printf("%s error %d in DosGetDateTime\n", progname, ret) ;
- DosClose(hf) ;
- return( (int) ret ) ;
- }
-
- fstat.fdateLastAccess.day = dtim.day ;
- fstat.fdateLastAccess.month = dtim.month ;
- fstat.fdateLastAccess.year = (unsigned) dtim.year - 1980 ; /* years represented relative to 1980 */
- fstat.ftimeLastAccess.twosecs = dtim.seconds/2 ;
- fstat.ftimeLastAccess.minutes = dtim.minutes ;
- fstat.ftimeLastAccess.hours = dtim.hours ;
- fstat.fdateLastWrite = fstat.fdateLastAccess ;
- fstat.ftimeLastWrite = fstat.ftimeLastAccess ;
- if ((ret = DosSetFileInfo(hf, 1, (PBYTE) &fstat, (USHORT) sizeof(fstat))) != 0)
- {
- if (( ret = DosNewSize(hf, fstat.cbFile)) != 0) /* clever no-op = change files size
- to what it already was. This is needed because in DOS-
- compatility mode DosSetFileInfo does not work in 1.21 */
- {
-
- printf("%s unable to set time\n", progname) ;
- DosClose(hf) ;
- return( (int) ret ) ;
- }
- }
-
- /* close file */
- DosClose(hf) ;
- return( 0 ) ;
-
- }
-